jQuery.noConflict();

jQuery(document).ready(function() {
			jQuery("#accordion").accordion();
			jQuery("#accordion").draggable();

			// =============== web service URLS ======================
			var acceleration_ws_url = "/cgi/UpdateVitesse_WS";
			var direction_ws_url = "/cgi/UpdateDirection_WS";
			var frein_ws_url = "/cgi/Freinage_WS";
			var batterie_ws_url = "/cgi/Batterie_WS";
			var vitesse_ws_url = "/cgi/Vitesse_WS";
			var fc_g_ws_url = "/cgi/FinCourseGauche_WS";
			var fc_d_ws_url = "/cgi/FinCourseDroite_WS";

			// =============== update periods in seconds
			// ========================
			var frein_update_period = 1;
			var betterie_update_period = 2;
			var vitesse_update_period = 2;
			var fc_g_update_period = 1;
			var fc_d_update_period = 1;

			// =============== image URLS ============================
			var info_src = "images/infos.png";
			var error_src = "images/errors.png";
			var green_on_src = "images/green-on.gif";
			var green_off_src = "images/green-off.gif";
			var red_blink_src = "images/red-blink-0.gif";

			// =============== welcom ================================
			jQuery.gritter.add({
						title : "Welcome!",
						text : "to the CAN VIA Interface.",
						image : info_src
					});

			// =============== common error ===========================
			var display_error = function(msg, time) {
				jQuery.gritter.add({
							title : "Error",
							text : msg,
							time : time,
							image : error_src
						});
			}

			var common_error = function() {
				display_error("Something went wrong!", 2000);
			}

			var json_parse_error = function() {
				display_error("Cannot parse JSON response from server.", 2000);
			}

			// =============== acceleration ===========================

			var acceleration_handler = function() {
				var value = jQuery("#acceleration").slider("value");

				switch (value) {
					case 0 : {
						jQuery("#acceleration_value").html("0");
						break;
					}
					case 10 : {
						jQuery("#acceleration_value").html("1");
						break;
					}
					case 20 : {
						jQuery("#acceleration_value").html("2");
						break;
					}
					case 30 : {
						jQuery("#acceleration_value").html("3");
						break;
					}
					case 40 : {
						jQuery("#acceleration_value").html("4");
						break;
					}
					case 50 : {
						jQuery("#acceleration_value").html("5");
						break;
					}
					case 60 : {
						jQuery("#acceleration_value").html("6");
						break;
					}
					case 70 : {
						jQuery("#acceleration_value").html("7");
						break;
					}
					case 80 : {
						jQuery("#acceleration_value").html("8");
						break;
					}
					case 90 : {
						jQuery("#acceleration_value").html("9");
						break;
					}
					default : {
						jQuery("#acceleration_value").html("0");
						break;
					}
				}

				// send AJAX request
				jQuery.ajax({
							url : acceleration_ws_url,
							data : {
								v : value
							},
							dataType : "json", // data type from server
							success : function(data) {
								if (data.success == false) {
									display_error(data.msg, 2000);
								}
							},
							error : common_error
						});
			}

			jQuery("#acceleration").slider({
						orientation : "vertical",
						range : "min",
						min : 0,
						max : 90,
						value : 0,
						step : 10,
						change : acceleration_handler
					});

			jQuery("#acceleration_value").html("0");

			// ============================== vitesses =====================
			jQuery("#V1").progressBar({
						value : 0,
						rows : 40,
						caption : "V1"
					});
			jQuery("#V2").progressBar({
						value : 0,
						rows : 40,
						caption : "V2"
					});
			jQuery("#V3").progressBar({
						value : 0,
						rows : 40,
						caption : "V3"
					});
			jQuery("#V4").progressBar({
						value : 0,
						rows : 40,
						caption : "V4"
					});

			var vitesse_handler = function(response) {
				var data = jQuery.parseJSON(response.responseText);

				if (data == null) {
					json_parse_error();
				} else {
					if (data.success == false) {
						display_error(data.msg, 2000);
						vitesse_updater.stop();
					} else {
						var v1 = data.V1;
						var v2 = data.V2;
						var v3 = data.V3;
						var v4 = data.V4;

						jQuery("#V1").progressBar({
									value : v1,
									rows : 40,
									caption : "V1"
								});
						jQuery("#V2").progressBar({
									value : v2,
									rows : 40,
									caption : "V2"
								});
						jQuery("#V3").progressBar({
									value : v3,
									rows : 40,
									caption : "V3"
								});
						jQuery("#V4").progressBar({
									value : v4,
									rows : 40,
									caption : "V4"
								});
					}
				}
			}

			var vitesse_updater = new Ajax.PeriodicalUpdater("",
					vitesse_ws_url, // server
					// URL
					{
						method : "get",
						frequency : vitesse_update_period,
						decay : 1,
						onSuccess : vitesse_handler,
						onFailure : function() {
							vitesse_updater.stop();

							common_error();
						}
					});

			// ============================== batterie =====================
			jQuery("#B").progressBar({
						value : 0,
						rows : 30,
						caption : "B"
					});
			jQuery("#led_b").attr("src", red_blink_src);

			var batterie_handler = function(response) {
				var data = jQuery.parseJSON(response.responseText);

				if (data == null) {
					json_parse_error();
				} else {
					if (data.success == false) {
						display_error(data.msg, 2000);
						batterie_updater.stop();
					} else {
						var value = data.batterie;

						jQuery("#B").progressBar({
									value : value,
									rows : 30,
									caption : "B"
								});

						if (value < 75) {
							jQuery("led_b").attr("src", red_blink_src);
						} else {
							jQuery("led_b").attr("src", green_on_src);
						}
					}
				}
			}

			var batterie_updater = new Ajax.PeriodicalUpdater("",
					batterie_ws_url, // server
					// URL
					{
						method : "get",
						frequency : betterie_update_period,
						decay : 1,
						onSuccess : batterie_handler,
						onFailure : function() {
							batterie_updater.stop();

							common_error();
						}
					});

			// ============================== frein ========================
			var frein_updater = new Ajax.PeriodicalUpdater("", frein_ws_url, // server
					// URL
					{
						method : "get",
						frequency : frein_update_period,
						decay : 1,
						onSuccess : function(response) {
							var data = jQuery.parseJSON(response.responseText);

							if (data == null) {
								json_parse_error();
							} else {
								if (data.success == false) {
									display_error(data.msg, 2000);
									frein_updater.stop();
								}
							}
						},
						onFailure : function() {
							frein_updater.stop();

							common_error();
						}
					});

			frein_updater.stop();

			jQuery("#frein").click(function() {
						if (jQuery(this).attr("checked") == "checked") {
							frein_updater.start();
						} else {
							frein_updater.stop();
						}
					});

			// ============================== direction ====================
			var direction_handler = function() {
				var value = jQuery("#direction").slider("value");

				// send AJAX request
				jQuery.ajax({
							url : direction_ws_url,
							data : {
								d : value
							},
							dataType : "json", // data type from server
							success : function(data) {
								if (data.success == false) {
									display_error(data.msg, 2000);
								}
							},
							error : common_error
						});
			}

			jQuery("#direction").slider({
						min : 0,
						max : 95,
						value : 45,
						step : 5,
						change : direction_handler
					});

			// ==================== fins de course ======================
			jQuery("#fc_g").attr("src", green_off_src);
			jQuery("#fc_d").attr("src", green_off_src);

			// ==================== fin de course gauche ================
			var fc_g_handler = function(response) {
				var data = jQuery.parseJSON(response.responseText);

				if (data == null) {
					json_parse_error();
				} else {
					if (data.success == false) {
						display_error(data.msg, 2000);
						fc_g_updater.stop();
					} else {
						var value = data.fin_de_course;

						if (value == 0) {
							jQuery("fc_g").attr("src", green_off_src);
						} else {
							jQuery("fc_g").attr("src", green_on_src);
						}
					}
				}
			}

			var fc_g_updater = new Ajax.PeriodicalUpdater("", fc_g_ws_url, // server
					// URL
					{
						method : "get",
						frequency : fc_g_update_period,
						decay : 1,
						onSuccess : fc_g_handler,
						onFailure : function() {
							fc_g_updater.stop();

							common_error();
						}
					});

			// ==================== fin de course droite ================
			var fc_d_handler = function(response) {
				var data = jQuery.parseJSON(response.responseText);

				if (data == null) {
					json_parse_error();
				} else {
					if (data.success == false) {
						display_error(data.msg, 2000);
						fc_d_updater.stop();
					} else {
						var value = data.fin_de_course;

						if (value == 0) {
							jQuery("fc_d").attr("src", green_off_src);
						} else {
							jQuery("fc_d").attr("src", green_on_src);
						}
					}
				}
			}

			var fc_d_updater = new Ajax.PeriodicalUpdater("", fc_d_ws_url, // server
					// URL
					{
						method : "get",
						frequency : fc_d_update_period,
						decay : 1,
						onSuccess : fc_d_handler,
						onFailure : function() {
							fc_d_updater.stop();

							common_error();
						}
					});
		});